package com.dmz.etc.server.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalTime;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author lee
 */
@Slf4j
@Service
public class Daily4051TaskService {

    // 标记任务是否已完成
    private final AtomicBoolean taskCompleted = new AtomicBoolean(false);
    // 标记是否在有效时间范围内（0-12点）
    private boolean isInValidTimeRange = true;

    @Resource
    private TaskService taskService;

    /**
     * 应用启动时初始化时间范围状态
     */
    @PostConstruct
    public void init() {
        LocalTime currentTime = LocalTime.now();
        // 判断当前时间是否在16-23点之间（包括16点和23点）
        isInValidTimeRange = !currentTime.isBefore(LocalTime.of(15, 0)) &&
                !currentTime.isAfter(LocalTime.of(23, 0));

        log.info("应用启动时间: {}, 是否在有效时间范围(16-23点): {}, 任务完成状态: {}",
                currentTime, isInValidTimeRange, taskCompleted.get());

        // 如果当前时间已经过了23点（大于23:00），但任务未完成，标记为完成
        if (currentTime.isAfter(LocalTime.of(23, 0)) && !taskCompleted.get()) {
            taskCompleted.set(true);
            log.info("当前时间已过23点，标记任务为完成状态");
        }
    }

    /**
     * 每天0点重置任务状态
     */
    @Scheduled(cron = "0 0 14 * * ?")
    public void resetTaskStatus() {
        taskCompleted.set(false);
        isInValidTimeRange = true;
        log.info("每日任务状态已重置，开始新的轮询周期");
    }

    /**
     * 每天12点停止轮询
     */
    @Scheduled(cron = "0 0 23 * * ?")
    public void stopPolling() {
        isInValidTimeRange = false;
        log.info("到达12点，停止今日轮询");
    }

    /**
     * 每2分钟轮询一次任务（测试用2分钟，生产环境改为20分钟）
     */
    @Scheduled(cron = "0 1/20 14-23 * * ?")
    public void pollTask() {
        if (!isInValidTimeRange) {
            log.debug("不在有效时间范围内，跳过执行");
            return;
        }

        if (taskCompleted.get()) {
            log.debug("任务已完成，跳过本次轮询");
            return;
        }

        try {
            log.info("开始执行轮询任务，文件: {}", "KJ4051");
            log.info("开始执行轮询任务，时间: {}", LocalTime.now());
            boolean success = executeBusinessTask();

            if (success) {
                taskCompleted.set(true);
                log.info("任务执行成功，停止后续轮询");
            } else {
                log.info("任务执行失败，继续轮询");
            }

        } catch (Exception e) {
            log.error("任务执行异常，继续轮询", e);
        }
    }

    /**
     * 实际的业务任务执行逻辑
     */
    private boolean executeBusinessTask() {
        try {
            return taskService.task4051();
        } catch (Exception e) {
            log.error("业务任务执行异常", e);
            return false;
        }
    }

    /**
     * 手动触发任务（可选）
     */
    public boolean triggerTaskManually() {
        if (taskCompleted.get()) {
            log.info("任务已完成，无需手动触发");
            return true;
        }

        return executeBusinessTask();
    }


    // 获取任务状态（用于监控）
    public boolean isTaskCompleted() {
        return taskCompleted.get();
    }

    public boolean isInValidTimeRange() {
        return isInValidTimeRange;
    }
}